package thread;

/**
 * 多线程并发安全问题
 * 当多个线程并发操作同一临界资源，由于线程切换时机不确定，导致操作顺序出现混乱从而
 * 引发不良后果。
 * 临界资源: 多个线程共享同一数据，多个线程不应同时操作的资源
 */
public class SyncDemo1 {
    static boolean success1 = false;//第一个线程是否取款成功
    static boolean success2 = false;//第二个线程是否取款成功
    public static void main(String[] args) {
        Bank bank = new Bank();

        while(true) {
            Thread t1 = new Thread("张三") {
                public void run() {
                    success1 = bank.getMoney(20000);
                }
            };
            Thread t2 = new Thread("李四") {
                public void run() {
                    success2 = bank.getMoney(20000);
                }
            };
            t1.start();
            t2.start();

            try {
                Thread.sleep(5);
            } catch (InterruptedException e) {
                throw new RuntimeException(e);
            }
            if (success1 && success2) {
                System.out.println("全部取款成功,出现并发安全问题了!!");
                break;
            } else {
                System.out.println("一方成功，一切正常");
                bank.saveAccount(20000);//重新存入，再次尝试
                success1 = false;
                success2 = false;
            }
        }
    }
}
